public class Main{
	public static void main(String[] args){
		//if(){}
		int n = 70;
        if (n >= 60) {
            System.out.println("及格了");
        }
        System.out.println("END");

        //if(){}内多语句
        int n = 70;
        if (n >= 60) {
            System.out.println("及格了");
            System.out.println("恭喜你");
        }
        System.out.println("END");

        //else(){}
        int n = 70;
        if (n >= 60) {
            System.out.println("及格了");
        } else {
            System.out.println("挂科了");
        }
        System.out.println("END");

        //else if(){}
        int n = 70;
        if (n >= 90) {
            System.out.println("优秀");
        } else if (n >= 60) {
            System.out.println("及格了");
        } else {
            System.out.println("挂科了");
        }
        System.out.println("END");

        //串联的效果相当于
        if (n >= 90) {
            // n >= 90为true:
            System.out.println("优秀");
        } else {
            // n >= 90为false:
            if (n >= 60) {
                // n >= 60为true:
                System.out.println("及格了");
            } else {
                // n >= 60为false:
                System.out.println("挂科了");
            }
        }

        //注意边界条件
        int n = 90;
        if (n > 90) {
            System.out.println("优秀");
        } else if (n >= 60) {
            System.out.println("及格了");
        } else {
            System.out.println("挂科了");
        }

        //前面讲过了浮点数在计算机中常常无法精确表示，并且计算可能出现误差，因此，判断浮点数相等用==判断不靠谱
        double x = 1 - 9.0 / 10;
        if (x == 0.1) { //小数判断,并不精确
            System.out.println("x is 0.1");
        } else {
            System.out.println("x is NOT 0.1");
        }

        //正确的方法是利用差值小于某个临界值来判断：
        double x = 1 - 9.0 / 10; //得1 - 0.9 = 0.1
        if(Math.abs(x - 0.1) < 0.00001){ //通过近似0和0.00001比较,无法精确小数,通过更多小数位来弥补
        	System.out.println("x is 0.1");
        } else {
        	System.out.println("x is not 0.1")
        }

        //判断引用类型相等
        String s1 = "hello";
        String s2 = "HELLO".toLowerCase();

        System.out.println(s1);
        System.out.println(s2);

        if (s1 == s2) {
            System.out.println("s1 == s2");
        } else {
            System.out.println("s1 != s2");
        }

        //判断'引用类型的变量内容'是否相等,必须使用equals()方法,也就是2者最后引用的实际对象是否相等
        String s1 = "hello";
        String s2 = "HELLO".toLowerCase();
        System.out.println(s1);
        System.out.println(s2);

        if (s1.equals(s2)) {
            System.out.println("s1 equals s2");
        } else {
            System.out.println("s1 not equals s2");
        }

        //注意：执行语句s1.equals(s2)时，如果变量s1为null，会报NullPointerException
        String s1 = null;
        if (s1.equals("hello")){//报NullPointerException
            System.out.println("hello");
        }

        //要避免NullPointerException错误，可以利用短路运算符&&
        String s1 = null;
        if (s1 != null && s1.equals("hello")) {
            System.out.println("hello");
        }
        //还可以把一定不是null的对象"hello"放到前面：例如：if ("hello".equals(s)) { ... }
	}
}

/*
由于使用缩进格式，很容易把两行语句都看成if语句的执行块，但实际上只有第一行语句是if的执行块。在使用git这些版本控制系统自动合并时更容易出问题，所以不推荐忽略花括号的写法。

！在串联使用多个if时，要特别注意判断顺序。！
*/

/* 小结
1.if ... else可以做条件判断，else是可选的；

2.不推荐省略花括号{}；

3.多个if ... else串联要特别注意判断顺序；

4.要注意if的边界条件；

5.要注意浮点数判断相等不能直接用==运算符；

6.引用类型判断内容相等要使用equals()，注意避免NullPointerException。

*/